#include "../games/globale.h" // Fonction et Headers globaux
#include "../games/cls_game.h" // Classe des gestion du curseur de la souris

/* ----------------------------------------------------
			Constructeur
  ----------------------------------------------------- */
cls_Game::cls_Game()
{
    debugTrace("Constructeur cls_Game");
    this->p_sdlS_Ecran = NULL;
    this->objDecors.empty();
}

/* ----------------------------------------------------
			Destructeur
  ----------------------------------------------------- */
cls_Game::~cls_Game()
{
    debugTrace("Destructeur cls_Game");
    this->p_sdlS_Ecran = NULL;
}

/* ----------------------------------------------------
			On charge les différents objets du jeux
  ----------------------------------------------------- */
int cls_Game::Init(SDL_Surface* p_sdlS_Ecran)
{
    this->p_sdlS_Ecran = p_sdlS_Ecran;

    // Initialisation des Dialogues
    if (this->dialogNiveau01.Init() != RETOK)
    {
        return NOTOK;
    }

    // Initialisation du Scénario
    if (this->scenarioNiveau01.Init() != RETOK)
    {
        return NOTOK;
    }

    // Initialisation des differentes images pour le curseur et sélection d'un curseur
    this->obj_Mouse.fct_InitMouse();
    this->obj_Mouse.fct_SetMouseCursor(MOUSE_CURSOR_MOVE);

    // cls_Mouse obj_Mouse
    // cls_PrimitiveTexte texte_Joueur
    // cls_PrimitiveTexte texte_DescriptionObjet
    this->toolbar_Jeux.fct_InitToolbar(&this->obj_Mouse, &this->texte_Joueur, &this->texte_DescriptionObjet);

    // Initialisation de la font pour ce type de dialogue
    this->texte_Joueur.fct_InitFont(PATH_DATA_FONTS_UBUNTU);
    this->texte_DescriptionObjet.fct_InitFont(PATH_DATA_FONTS_UBUNTU);

    // Chargement de l'image de fond
    // cls_Mouse obj_Mouse
    // cls_Scenario scenarioNiveau01
    this->map_Niveau1.fct_InitMap(&this->obj_Mouse, &this->scenarioNiveau01);

    // Initialisation des différents personnages
    for(unsigned int i(0); i<this->scenarioNiveau01.t_valPerso.size(); i++)
    {
        cls_Personnage newPerso;
        debugTrace("cls_Personnage : Déclaration Temporaire");
        newPerso.fct_InitPersonnage(&this->map_Niveau1, &this->texte_Joueur, &this->scenarioNiveau01, &this->dialogNiveau01, &this->scenarioNiveau01.t_valPerso[i]);
        this->objPersos.push_back(newPerso);
        debugTrace("cls_Personnage : Ajout de l'instance temporaire dans le tableau");
    }

    // Initialisation des différents objets
    for(unsigned int i(0); i<this->scenarioNiveau01.t_valObjets.size(); i++)
    {
        cls_Objet newObjet;
        debugTrace("cls_Objet : Déclaration Temporaire");
        newObjet.fct_InitObjet(&this->obj_Mouse, &this->scenarioNiveau01, &this->dialogNiveau01, &this->map_Niveau1, &this->texte_DescriptionObjet, &this->scenarioNiveau01.t_valObjets[i]);
        this->objDecors.push_back(newObjet);
        debugTrace("cls_Objet : Ajout de l'instance temporaire dans le tableau");
    }


    return RETOK;
}

/* ----------------------------------------------------
			On lance le jeux
  ----------------------------------------------------- */
void cls_Game::Run()
{

    SDL_Event sdlS_Event;

    bool b_quit = false;
    bool b_isSynchro;
    int n_CurrentTime;

// ----------------------------------------FRAMERATE-------------------------
// ++JODA TEST FPS
int frame = 0;
//Timer utilise pour calculer le nombre de frames par seconde
cls_Timer fps;
//Timer utilise pour mettre à jour la barre de caption
cls_Timer update;

// ++JODA
//On demarre le timer update
update.start();
//On demarre le timer fps
fps.start();

/*
FPSmanager manager;
//Initialisation
SDL_initFramerate(&manager);
//Mettre le nombre d'images par secondes souhaite
SDL_setFramerate(&manager,25);
*/
// ----------------------------------------FRAMERATE-------------------------


    while (b_quit == false)
    {

        while( SDL_PollEvent( &sdlS_Event ) )
        {

        // On envoie l'evenement recupéré aux objets
            this->map_Niveau1.fct_HandleInput(sdlS_Event);

        // On ne gère qu'un seul perso pour le moment
            this->objPersos[0].fct_HandleInput(sdlS_Event);

            for(unsigned int i(0); i<this->objDecors.size(); i++)
            {
                this->objDecors[i].fct_HandleInput(sdlS_Event);
            }

            this->toolbar_Jeux.fct_HandleInput(sdlS_Event);


        // Gestion des évènements par l'objet principal, le programme
            switch(sdlS_Event.type)
            {
                case SDL_QUIT:
                    //On quitte le programme
                    b_quit = true;
                    break;
                case SDL_KEYDOWN: /* Si appui d'une touche */
                    switch (sdlS_Event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: /* Appui sur la touche Echap, on arrête le programme */
                            b_quit = true;
                            break;

                        default:
                            break;
                    }
                    break;
            }


            //Si l'utilisateur ferme la fenêtre avec le X
            if( sdlS_Event.type == SDL_QUIT )
            {
                //On quitte le programme
                b_quit = true;
            }

		}

        // On efface l'ecran
        SDL_FillRect(this->p_sdlS_Ecran, NULL, SDL_MapRGB(this->p_sdlS_Ecran->format, 255, 255, 255));

        // On recupere la valeur de l'instant T
        n_CurrentTime = SDL_GetTicks();


        do
        {
            // On initialise le flag sur la synchronisation des frames
            b_isSynchro=true;

            // On met l'image de fond
            this->map_Niveau1.fct_DrawMap(this->p_sdlS_Ecran, n_CurrentTime);

            // ---------------------------------------------------------------
            // Dessine les objets situés derriere le personnage
            // ---------------------------------------------------------------
            for(unsigned int i(0); i<this->objDecors.size(); i++)
            {
                if ((this->objDecors[i].fct_GetPosY() + this->objDecors[i].fct_GetHeight()) < (this->objPersos[0].fct_GetPosY() + this->objPersos[0].fct_GetHeight()))
                {
                    this->objDecors[i].fct_DrawObjet(this->p_sdlS_Ecran, n_CurrentTime);
                }
            }

            // ---------------------------------------------------------------
            // On dessine le personnage
            // ---------------------------------------------------------------
            if(this->objPersos[0].fct_DrawPerso(this->p_sdlS_Ecran, n_CurrentTime) == REDRAW_ALL)
            {
                b_isSynchro = false;
            }

            // ---------------------------------------------------------------
            // Dessine les objets situés devant le personnage
            // ---------------------------------------------------------------
            for(unsigned int i(0); i<this->objDecors.size(); i++)
            {
                if ((this->objDecors[i].fct_GetPosY() + this->objDecors[i].fct_GetHeight()) > (this->objPersos[0].fct_GetPosY() + this->objPersos[0].fct_GetHeight()))
                {
                    this->objDecors[i].fct_DrawObjet(this->p_sdlS_Ecran, n_CurrentTime);
                }
            }

            this->toolbar_Jeux.fct_DrawToolbar(this->p_sdlS_Ecran, n_CurrentTime);
/*
            // On dessine le texte (si il y en a a affiché bien sur !)
            texte_Joueur.fct_DrawTexte(p_sdlS_Ecran, n_CurrentTime, 80, 8);
            texte_DescriptionObjet.fct_DrawTexte(p_sdlS_Ecran, n_CurrentTime, 80, 8);
*/
            // Et sur le calque le plus élevé, on dessine la souris
            // On dessine le curseur de la souris
            this->obj_Mouse.fct_DrawMouse(this->p_sdlS_Ecran);

        }
        while(!b_isSynchro); // Tand que l'on est pas synchro, on recommence
        /* -----------------------------------------------------------*/

        // On met à jour l'affichage (Double duffering)
        SDL_Flip(this->p_sdlS_Ecran);


// ----------------------------------------FRAMERATE-------------------------
/*
SDL_framerateDelay(&manager);
*/
// ++JODA FPS
frame++;

// ++JODA
//Si une seconde est passee depuis la derniere mise à jour de la barre caption
if( update.get_ticks() > 1000 )
{
    //Une chaine de caracteres temporaire
    char caption[ 64 ];

    //On calcule le nombre de frames par seconde et on cree la chaine de caracteres
    sprintf(caption, "Les aventures de MAX : %0.2f FPS", (float)frame / ( fps.get_ticks() / 1000.f ) );

    //On remet à zero la barre caption
    SDL_WM_SetCaption( caption, NULL );

    //On relance le timer update
    update.start();
}
// ----------------------------------------FRAMERATE-------------------------

    }


}

/* ----------------------------------------------------
			On libere les surfaces utilisé lors du jeux
  ----------------------------------------------------- */
void cls_Game::FreeSurface()
{

    // Nettoyage de la memoire

    for(unsigned int i(0); i<this->objDecors.size(); i++)
    {
        this->objDecors[i].fct_FreeSurface();
    }

    for(unsigned int i(0); i<this->objPersos.size(); i++)
    {
        this->objPersos[i].fct_FreeSurface();
    }

    this->map_Niveau1.fct_FreeSurface();

    this->texte_Joueur.fct_FreeSurface();
    this->texte_DescriptionObjet.fct_FreeSurface();

    this->obj_Mouse.fct_FreeSurface();

    this->toolbar_Jeux.fct_FreeSurface();

}
